package com.dd.controller;

import javafx.fxml.FXML;
import javafx.scene.control.Alert;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.event.ActionEvent;
import javafx.stage.Stage;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.fxml.FXMLLoader;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.List;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
/*`LoginController` 是 JavaFX 应用中的登录页面控制器类，主要负责用户登录相关的交互逻辑。它的主要功能包括：

1. **角色选择与输入校验**：  
   用户可以选择自己的角色（管理员、网格员、公众监督员），并输入用户名和密码。点击登录按钮时，会校验输入是否完整。

2. **用户身份验证**：  
   通过读取 `user.json` 文件，校验用户输入的角色、用户名和密码是否正确。

3. **根据角色跳转到不同主界面**：  
   - **管理员**：登录成功后跳转到主界面（`main.fxml`）。
   - **网格员**：登录成功后跳转到“反馈任务列表”页面（`feedback_task_list.fxml`）。
   - **公众监督员**：登录成功后跳转到“选择网格”页面（`select_grid.fxml`）。

4. **错误与提示信息**：  
   登录失败、文件找不到、验证出错等情况会弹窗提示用户。

5. **用户数据类**：  
   内部静态类 `User` 用于封装和解析用户信息。

---

**总结**：  
这个类就是“登录页面”的控制器，负责处理用户登录、身份校验、角色分流和界面跳转等所有与登录相关的功能。
*/

public class LoginController {

    @FXML
    private ComboBox<String> roleComboBox;
    @FXML
    private TextField usernameField;
    @FXML
    private PasswordField passwordField;
    @FXML
    private Button loginButton;

    @FXML
    public void initialize() {
        // 初始化角色下拉框
        ObservableList<String> roles = FXCollections.observableArrayList(
            "系统管理员", "网格员", "公众监督员"
        );
        roleComboBox.setItems(roles);
        roleComboBox.setValue("系统管理员"); // 默认选择管理员
    }

    @FXML
    public void handleLoginButtonClick() {
        String selectedRole = roleComboBox.getValue();
        String username = usernameField.getText();
        String password = passwordField.getText();

        if (selectedRole == null || username.isEmpty() || password.isEmpty()) {
            showAlert(Alert.AlertType.ERROR, "输入错误", "请选择角色并填写完整的登录信息。");
            return;
        }

        // 从user.json读取用户信息进行验证
        if (validateUser(selectedRole, username, password)) {
            
            // 只有管理员才能进入主界面
            if ("系统管理员".equals(selectedRole)) {
                showAlert(Alert.AlertType.INFORMATION, "登录成功", selectedRole + "欢迎使用东软环保公众监督系统");
                navigateToMainInterface();
            } else if ("公众监督员".equals(selectedRole)) {
                showAlert(Alert.AlertType.INFORMATION, "登录成功", selectedRole + "欢迎使用东软环保公众监督系统");
                navigateToSelectGrid();
            } else if ("网格员".equals(selectedRole)) {
                showAlert(Alert.AlertType.INFORMATION, "登录成功", selectedRole + "欢迎使用东软环保公众监督系统");
                navigateToFeedbackTaskList();
            }
        } else {
            showAlert(Alert.AlertType.ERROR, "登录失败", "登录信息不正确，请检查角色、用户名和密码。");
        }
    }

    private boolean validateUser(String role, String username, String password) {
        try {
            Gson gson = new Gson();
            InputStream inputStream = getClass().getResourceAsStream("/user.json");
            
            if (inputStream == null) {
                showAlert(Alert.AlertType.ERROR, "文件错误", "找不到user.json文件，请确保文件位于resources目录下。");
                return false;
            }
            
            Reader reader = new InputStreamReader(inputStream, "UTF-8");
            List<User> users = gson.fromJson(reader, new TypeToken<List<User>>(){}.getType());
            
            for (User user : users) {
                if (role.equals(user.getRole()) && username.equals(user.getUsername()) && password.equals(user.getPassword())) {
                    return true;
                }
            }
            
            reader.close();
            inputStream.close();
            
        } catch (Exception e) {
            e.printStackTrace();
            showAlert(Alert.AlertType.ERROR, "验证错误", "读取用户信息时发生错误：" + e.getMessage());
        }
        return false;
    }

    private void navigateToMainInterface() {
        try {
            Stage currentStage = (Stage) loginButton.getScene().getWindow();
            FXMLLoader loader = new FXMLLoader(getClass().getResource("/com/dd/main.fxml"));
            Parent mainRoot = loader.load();
            
            Scene mainScene = new Scene(mainRoot);
            currentStage.setScene(mainScene);
            currentStage.setTitle("东软环保公众监督系统 - 管理端主界面");
            currentStage.setResizable(true);
            currentStage.show();
            
        } catch (IOException e) {
            e.printStackTrace();
            showAlert(Alert.AlertType.ERROR, "加载界面失败", "无法加载主界面，请检查FXML文件路径和内容。");
        }
    }

    private void navigateToSelectGrid() {
        try {
            Stage currentStage = (Stage) loginButton.getScene().getWindow();
            FXMLLoader loader = new FXMLLoader(getClass().getResource("/com/dd/select_grid.fxml"));
            Parent root = loader.load();
            Scene scene = new Scene(root);
            currentStage.setScene(scene);
            currentStage.setTitle("选择网格 - 东软环保公众监督平台");
            currentStage.setResizable(false);
            currentStage.show();
        } catch (IOException e) {
            e.printStackTrace();
            showAlert(Alert.AlertType.ERROR, "加载界面失败", "无法加载选择网格界面，请检查FXML文件路径和内容。");
        }
    }

    private void navigateToFeedbackTaskList() {
        try {
            Stage currentStage = (Stage) loginButton.getScene().getWindow();
            FXMLLoader loader = new FXMLLoader(getClass().getResource("/com/dd/feedback_task_list.fxml"));
            Parent root = loader.load();
            currentStage.setScene(new Scene(root, 700, 600));
            currentStage.setTitle("反馈任务列表 - 东软环保公众监督平台");
            currentStage.setResizable(false);
            currentStage.show();
        } catch (Exception e) {
            e.printStackTrace();
            showAlert(Alert.AlertType.ERROR, "加载界面失败", "无法加载反馈任务列表界面，请检查FXML文件路径和内容。");
        }
    }

    private void showAlert(Alert.AlertType alertType, String title, String message) {
        Alert alert = new Alert(alertType);
        alert.setTitle(title);
        alert.setHeaderText(null);
        alert.setContentText(message);
        alert.showAndWait();
    }

    // 用户数据类
    public static class User {
        private String role;
        private String username;
        private String password;

        public String getRole() { return role; }
        public void setRole(String role) { this.role = role; }
        public String getUsername() { return username; }
        public void setUsername(String username) { this.username = username; }
        public String getPassword() { return password; }
        public void setPassword(String password) { this.password = password; }
    }
}
